package com.Shuang.Demo2;

import java.util.*;

/***需求**
        * 某个班级组织团建活动，班长给出了几个去处给大家选择，分别是 “农家乐” , "轰趴"，“野外拓展”，“健身房”，本次活动每个学生是可以多选的。
        * 现在有如下5名学生选择了如下去处。
        ```
        张全蛋儿  农家乐","野外拓展","轰趴"
        李二狗子  "轰趴", "野外拓展", "健身房"
        翠花     "野外拓展","轰趴"
        小帅     "健身房"
        有容     "农家乐"
        ```
        **具体的功能点如下：**
        1、请找出每个去处想去的人数是多少，并输出投票最多的去处是哪个。
        2、请找出哪些人没有选择投票最多的去处，输出他们的名字。
 */

public class Test {
    public static void main(String[] args) {
        //1 将上述数据分别设置好
        Student s1 = new Student("张全蛋儿", new String[]{"农家乐","野外拓展","轰趴"});
        Student s2 = new Student("李二狗子", new String[]{"轰趴", "野外拓展", "健身房"});
        Student s3 = new Student("翠花 ", new String[]{"野外拓展","轰趴"});
        Student s4 = new Student("小帅 ", new String[]{"健身房"});
        Student s5 = new Student("有容", new String[]{"农家乐"});

        //2 将各个学生放到集合中去
        List<Student> students = new ArrayList<>();
        Collections.addAll(students, s1, s2, s3, s4, s5);

        System.out.println("各个学生的选择如下：");
        for (Student student : students) {
            System.out.println(student);
        }

        //3 遍历集合 找到地点放到map集合中去，用键值对的值来确定每个地点选择的人数
        Map<String, Integer> selects = new HashMap<>();
        for (Student student : students) {
            //遍历每个学生的选择
            for (String s : student.getOption()) {
//                if (selects.containsKey(s)){
//                    selects.put(s, selects.get(s) + 1);
//                }else {
//                    selects.put(s, 1);
//                }
                selects.put(s, selects.containsKey(s) ? (selects.get(s) + 1) : 1);
            }
        }
        System.out.println("每个地点想去的人数是：");
        System.out.println(selects);

        //4 找到选择人数最多的地点
        Map.Entry<String, Integer> maxEntry = selects.entrySet().stream()
                .max((o1, o2) -> (o1.getValue() - o2.getValue())).get();

        //5 因为可能有相同的选择人数最多的 多个地点 比如有两个地点都是最多3个人选择 进行如下处理
        System.out.println("投票最多的去处是：");
//        selects.entrySet().stream().filter(o -> (o.getValue() == maxEntry.getValue()))
//                .forEach(o -> System.out.println(o.getKey()));

        //将投票最多的去处存起来，后续要用
        List<String> maxOptionSpots = new ArrayList<>();
        selects.entrySet().stream().filter(o -> (o.getValue() == maxEntry.getValue()))
                .forEach(o -> maxOptionSpots.add(o.getKey()));

        System.out.println(maxOptionSpots);

        //6 找出哪些人没有选择投票最多的去处，输出他们的名字。
        System.out.println("没有选择投票人数最多地点的人如下：");
        students.stream().filter(s -> {
            boolean flag = true; //为true代表学生选择里不包含人数最多的那个地点
            for (String option : s.getOption()) {
                if (maxOptionSpots.contains(option)){
                    flag = false;
                    break;
                }
            }
            return flag;
        }).forEach(s -> System.out.println(s.getName()));
    }
}
